共计 5147 个字符,预计需要花费 13 分钟才能阅读完成。
引入
-
前一篇所说的基础权限 u, g, o 以及 特殊权限 都是针对一类用户设置的
-
但如果咱们想要自定义用户分配, 也就是更精细化的控制权限分配
-
比如 : 让某一个用户对某个文件具有某种权限
- 这时咱们就可以使用到文件的访问控制列表 ACL(Access Control Lit)
⛅"u g o" 只能设置一个用户, 一个组或者 other
⛅"ACL" 可以对 "r w x" 进行用户设置(允许谁和不允许谁)
⛅"ACL" 只能是 "root" 来设置
⛅相关命令: getfacl(查看), setfacl(设置)
一.ACL 的基本使用方式
- 命令
getfacl | 查看权限 |
---|---|
setfacl | 设置权限 |
- 选项
-m | 设定 ACL 的权限 |
---|---|
-x | 删除某一用户或组的 ACL 权限 |
-b | 删除所有的 ACL 权限 |
-R | 递归的设定 ACL 权限 |
d:(default) | 继承, 设定默认的 ACL 权限, 在父目录下新建的文件都会继承此权限 |
mask: | 决定用户的最高权限 |
- 语法
修改属主的权限 | setfacl -m u: :[权限] [文件] |
---|---|
修改属组的权限 | setfacl -m g: :[权限] [文件] |
修改其他人权限 | setfacl -m o: :[权限] [文件] |
修改某一用户的权限 | setfacl -m u:[用户名]:[权限] [文件] |
修改具体某一个组的权限 | setfacl -m g:[组名]:[权限] [文件] |
继承 | setfacl -m d:u:[用户名]:[权限] [父目录] |
修改最大权限 mask | setfacl -m mask::[权限] [文件] |
1. 让咱们先设置好一个实验环境, 让使用方式更易懂
⛅先创建一个目录和文件作为演示对象
[root@shawn ~]# mkdir /cccc/
[root@shawn ~]# touch /cccc/a.txt
[root@shawn ~]# echo 123 > /cccc/a.txt
⛅创建三个用户和一个组
[root@shawn ~]# useradd song1
[root@shawn ~]# useradd song2
[root@shawn ~]# useradd song3
[root@shawn ~]# groupadd ggg1
1.getfacl
: 查看权限
⛅使用 "getfacl" 命令查看 ACL 权限
[root@shawn ~]# getfacl /cccc/a.txt
getfacl /cccc/a.txt
getfacl: Removing leading '/' from absolute path names
# file: cccc/a.txt
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
2.setfacl
: 设置权限
注意: 当使用 setfacl
设置权限时就不要再使用 chmod
设置了, 会影响 mask
- setfacl设置权限置空
⛅置空属主的权限
[root@shawn ~]# setfacl -m u::- !$
setfacl -m u::- /cccc/a.txt
⛅置空属组的权限
[root@shawn ~]# setfacl -m g::- !$
setfacl -m g::- /cccc/a.txt
⛅置空其他人的权限
[root@shawn ~]# setfacl -m o::- !$
setfacl -m o::- /cccc/a.txt
⛅再次查看 ACL 权限, 已经全部置空
[root@shawn ~]# getfacl !$
getfacl /cccc/a.txt
getfacl: Removing leading '/' from absolute path names
# file: cccc/a.txt
# owner: root
# group: root
user::---
group::---
other::---
- 需求: 用户 "song1" 只能对 "a.txt" 进行 "r" 操作
⛅对 "song1" 没有设置 "ACL" 权限时
[song1@shawn root]$ cat /cccc/a.txt
cat: /cccc/a.txt: 权限不够
[song1@shawn root]$ echo 123 > /cccc/a.txt
bash: /cccc/a.txt: 权限不够
⛅使用 "root" 进行设置 "r" 权限
[root@shawn ~]# setfacl -m u:song1:r /cccc/a.txt
[root@shawn ~]# su song1
⛅切到 "song1" 可读但不可写
[song1@shawn root]$ cat /cccc/a.txt
123
[song1@shawn root]$ echo 333 > !$
echo 333 > /cccc/a.txt
bash: /cccc/a.txt: 权限不够
- 用户 "song2" 只能对 "a.txt" 可以 "w" 操作
⛅对 "song2" 没有设置 "ACL" 权限时
[song2@shawn root]$ cat /cccc/a.txt
cat: /cccc/a.txt: 权限不够
[song2@shawn root]$ echo 123 > /cccc/a.txt
bash: /cccc/a.txt: 权限不够
⛅使用 "root" 进行设置 "r" 权限
[root@shawn ~]# setfacl -m u:song2:w /cccc/a.txt
[root@shawn ~]# su song2
⛅切到 "song2" 可写但不可读
[song2@shawn root]$ echo 3333 > /cccc/a.txt
[song2@shawn root]$ cat /cccc/a.txt
cat: /cccc/a.txt: 权限不够
⛅咱们使用 "root" 查看是否写进去了
[root@shawn ~]# cat /cccc/a.txt
3333
-
组 "ggg1" 对 "a.txt" 具有 "rw" 操作
-
用户 "song3" 为其他人, 当其加入组 "ggg1" 后
⛅"song3" 作为其他人时没有任何权限
[song3@shawn root]$ cat /cccc/a.txt
cat: /cccc/a.txt: 权限不够
[song3@shawn root]$ echo 4444 > !$
echo 4444 > /cccc/a.txt
bash: /cccc/a.txt: 权限不够
⛅使用 "root" 将组 "ggg1" 设置 "rw" 权限
[root@shawn ~]# setfacl -m g:ggg1:rw /cccc/a.txt
⛅将 "song3" 加入到组 "ggg1" 中
[root@shawn ~]# gpasswd -a song3 ggg1
正在将用户“song3”加入到“ggg1”组中
[root@shawn ~]# id song3
uid=1002(song3) gid=1002(song3) 组 =1002(song3),1003(ggg1)
⛅再次使用 "song3" 对 "a.txt" 发现可读可写
[song3@shawn root]$ echo 1234 > /cccc/a.txt
[song3@shawn root]$ cat !$
cat /cccc/a.txt
1234
- 经过以上步骤 "getfacl" 看看 ACL 权限
⛅再次查看 "ACL" 权限咱们可以发现多出了个 "mask",?? 这是什么??
[root@shawn ~]# getfacl /cccc/a.txt
getfacl: Removing leading '/' from absolute path names
# file: cccc/a.txt
# owner: root
# group: root
user::---
user:song1:r--
user:song2:-w-
group::---
group:ggg1:rw-
mask::rw-
other::---
3. 最大有效权限mask
mask
相当于一个权限筛子, 用户和组的权限受它的影响, 不包括文件所有者和 other
mask
最主要的作用就是用来决定用户和组的最高权限
- 与
mask
权限进行按位与运算得到最终权限 - 以 "r" 为例, 有权限 : 1 无 : 0
用户 / 组权限 | mask 权限 | 最终权限 |
---|---|---|
1 | 1 | 1 |
1 | 0 | 0 |
0 | 1 | 0 |
0 | 0 | 0 |
- 举例
song1 权限 : rwx r-- rw- -wx ....
mask 权限 : rw- rw- -w- rwx ....
最终权限 : rw- r- -w- -wx ....
- 演示 : mask 为空效果
⛅设置 "mask" 权限为空
[root@shawn ~]# setfacl -m mask::- /cccc/a.txt
⛅查看 "ACL" 权限
[root@shawn ~]# getfacl !$
getfacl /cccc/a.txt
getfacl: Removing leading '/' from absolute path names
# file: cccc/a.txt
# owner: root
# group: root
user::---
user:song1:r-- #effective:---
user:song2:-w- #effective:---
group::---
group:ggg1:rw- #effective:---
mask::---
other::---
- 分别使用三个用户来试试自己的权限
⛅"song1" 失败
[root@shawn ~]# su song1
[song1@shawn root]$ cat /cccc/a.txt
cat: /cccc/a.txt: 权限不够
[song1@shawn root]$ echo 222 >!$
echo 222 >/cccc/a.txt
bash: /cccc/a.txt: 权限不够
⛅"song2" 失败
[root@shawn ~]# su song2
[song2@shawn root]$ cat /cccc/a.txt
cat: /cccc/a.txt: 权限不够
[song2@shawn root]$ echo 444>/cccc/a.txt
bash: /cccc/a.txt: 权限不够
⛅"song2" 失败
[root@shawn ~]# su song3
[song3@shawn root]$ cat /cccc/a.txt
cat: /cccc/a.txt: 权限不够
[song3@shawn root]$ echo 1234 > /cccc/a.txt
bash: /cccc/a.txt: 权限不够
-
小结
-
mask
会影响除了文件所有者和 other 之外的人 mask
权限决定了用户访问文件时的最高权限mask
用于临时降低用户访问文件的权限
4. 继承权限 :default
- 想要对一个目录以及对这个目录 以后创建的 文件具有指定的权限, 就需要设置
default
了 -
注意 : 对当前目录下 已经存在 的文件 没有 相应 权限
-
-R
是对当前 已存在 的文件及目录 生效 , 对 后面创建的不生效
⛅咱们先创一个 "/cccc/bbbb"
[root@shawn ~]# mkdir /cccc/bbbb/
⛅分别对 "song1" 做递归权限, 对 "song2" 做继承权限
[root@shawn ~]# setfacl -R -m u:song1:rwx /cccc/
[root@shawn ~]# setfacl -m d:u:song2:- /cccc/
⛅来看看当前已存在文件和目录的 "ACL" 权限
⛅可以发现这个父目录对 "song1" 权限生效, 也对 "song2" 设置了继承
[root@shawn ~]# getfacl /cccc/
getfacl: Removing leading '/' from absolute path names
# file: cccc/
# owner: root
# group: root
user::rwx
user:song1:rwx
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:song2:---
default:group::r-x
default:mask::r-x
default:other::r-x
⛅来看 "/cccc/bbbb", 发现对已存在的文件递归设置生效, 继承不生效
[root@shawn ~]# getfacl /cccc/bbbb/
getfacl: Removing leading '/' from absolute path names
# file: cccc/bbbb/
# owner: root
# group: root
user::rwx
user:song1:rwx
group::r-x
mask::rwx
other::r-x
⛅我们再来创建新的文件
[root@shawn ~]# mkdir /cccc/dddd
⛅发现对后创建的文件递归无效了, 继承生效了(继承了 "song2" 对父目录的权限)
[root@shawn ~]# getfacl /cccc/dddd
getfacl: Removing leading '/' from absolute path names
# file: cccc/dddd
# owner: root
# group: root
user::rwx
user:song2:---
group::r-x
mask::r-x
other::r-x
default:user::rwx
default:user:song2:---
default:group::r-x
default:mask::r-x
default:other::r-x
正文完